import axios from 'axios'
import { getToken, setToken, getRefreshToken } from '@utils/auth'
// 咱们存到了localStorage  jwt
// 人家存到了  cookie      session
// 刷新 access_token 的接口
const refreshToken = () => {
    return instance.post('/auth/refresh', { refresh_token: getRefreshToken() }, true)
}

// 创建 axios 实例
const instance = axios.create({
    baseURL: process.env.GATSBY_API_URL, // 根据环境变量设置不同的路径
    timeout: 30000, // 接口超时时间
    headers: {
        'Content-Type': 'application/json', // 接口参数数据类型格式
    }
})

let isRefreshing = false // 标记是否正在刷新 token  // 如果正在刷新token 那么接口可能会请求失败 
let requests = [] // 存储待重发请求的数组   排队
// 响应头
instance.interceptors.response.use(response => {
    // code 10001(少穿id) 10002(账号密码有误) 10003（参数不正确）
    return response
}, error => {
    if (!error.response) {
        return Promise.reject(error)
    }
    // 如果接口 401了  说明token已经过期了
    // 刷新token 并且重发请求
    if (error.response.status === 401 && !error.config.url.includes('/auth/refresh')) {
        const { config } = error
        if (!isRefreshing) {
            isRefreshing = true // 标记为true 标识正在刷新token
            return refreshToken().then(res => {
                const { access_token } = res.data // 获取新token
                setToken(access_token) // 设置新token
                config.headers.Authorization = `Bearer ${access_token}` // 设置请求头token
                // token 刷新后将数组的方法重新执行
                requests.forEach((cb) => cb(access_token)) // 把存起来的接口拿出来重新执行
                requests = [] // 重新请求完清空
                return instance(config)
            }).catch(err => {
                console.log('抱歉，您的登录状态已失效，请重新登录！')
                return Promise.reject(err)
            }).finally(() => {
                isRefreshing = false // 关闭标记
            })
        } else {
            // 返回未执行 resolve 的 Promise
            return new Promise(resolve => {
                // 用函数形式将 resolve 存入，等待刷新后再执行
                requests.push(token => {
                    config.headers.Authorization = `Bearer ${token}`
                    resolve(instance(config))
                })
            })
        }
    }
    return Promise.reject(error)
})

// 给请求头添加 access_token
const setHeaderToken = (isNeedToken) => {
    const accessToken = isNeedToken ? getToken() : null
    if (isNeedToken) { // api 请求需要携带 access_token 
        if (!accessToken) {
            console.log('不存在 access_token 则跳转回登录页')
        }
        instance.defaults.headers.common.Authorization = `Bearer ${accessToken}`
    }
}

// 有些 api 并不需要用户授权使用，则无需携带 access_token；默认不携带，需要传则设置第三个参数为 true
export const get = (url, params = {}, isNeedToken = false) => {
    setHeaderToken(isNeedToken)
    return instance({
        method: 'get',
        url,
        params,
    })
}

export const post = (url, params = {}, isNeedToken = false) => {
    setHeaderToken(isNeedToken)
    return instance({
        method: 'post',
        url,
        data: params,
    })
}